﻿/*
 * FCKeditor - The text editor for Internet - http://www.fckeditor.net
 * Copyright (C) 2003-2009 Frederico Caldeira Knabben
 *
 * == BEGIN LICENSE ==
 *
 * Licensed under the terms of any of the following licenses at your
 * choice:
 *
 *  - GNU General Public License Version 2 or later (the "GPL")
 *    http://www.gnu.org/licenses/gpl.html
 *
 *  - GNU Lesser General Public License Version 2.1 or later (the "LGPL")
 *    http://www.gnu.org/licenses/lgpl.html
 *
 *  - Mozilla Public License Version 1.1 or later (the "MPL")
 *    http://www.mozilla.org/MPL/MPL-1.1.html
 *
 * == END LICENSE ==
 *
 * Compatibility code for Adobe AIR.
 */

if ( FCKBrowserInfo.IsAIR )
{
    var FCKAdobeAIR = (function()
    {
        /*
         * ### Private functions.
         */

        var getDocumentHead = function( doc )
        {
            var head ;
            var heads = doc.getElementsByTagName( 'head' ) ;

            if( heads && heads[0] )
                head = heads[0] ;
            else
            {
                head = doc.createElement( 'head' ) ;
                doc.documentElement.insertBefore( head, doc.documentElement.firstChild ) ;
            }

            return head ;
        } ;

        /*
         * ### Public interface.
         */
        return {
            FCKeditorAPI_Evaluate : function( parentWindow, script )
            {
                // TODO : This one doesn't work always. The parent window will
                // point to an anonymous function in this window. If this
                // window is destroyied the parent window will be pointing to
                // an invalid reference.

                // Evaluate the script in this window.
                eval( script ) ;

                // Point the FCKeditorAPI property of the parent window to the
                // local reference.
                parentWindow.FCKeditorAPI = window.FCKeditorAPI ;
            },

            EditingArea_Start : function( doc, html )
            {
                // Get the HTML for the <head>.
                var headInnerHtml = html.match( /<head>([\s\S]*)<\/head>/i )[1] ;

                if ( headInnerHtml && headInnerHtml.length > 0 )
                {
                    // Inject the <head> HTML inside a <div>.
                    // Do that before getDocumentHead because WebKit moves
                    // <link css> elements to the <head> at this point.
                    var div = doc.createElement( 'div' ) ;
                    div.innerHTML = headInnerHtml ;

                    // Move the <div> nodes to <head>.
                    FCKDomTools.MoveChildren( div, getDocumentHead( doc ) ) ;
                }

                doc.body.innerHTML = html.match( /<body>([\s\S]*)<\/body>/i )[1] ;

                //prevent clicking on hyperlinks and navigating away
                doc.addEventListener('click', function( ev )
                    {
                        ev.preventDefault() ;
                        ev.stopPropagation() ;
                    }, true ) ;
            },

            Panel_Contructor : function( doc, baseLocation )
            {
                var head = getDocumentHead( doc ) ;

                // Set the <base> href.
                head.appendChild( doc.createElement('base') ).href = baseLocation ;

                doc.body.style.margin    = '0px' ;
                doc.body.style.padding    = '0px' ;
            },

            ToolbarSet_GetOutElement : function( win, outMatch )
            {
                var toolbarTarget = win.parent ;

                var targetWindowParts = outMatch[1].split( '.' ) ;
                while ( targetWindowParts.length > 0 )
                {
                    var part = targetWindowParts.shift() ;
                    if ( part.length > 0 )
                        toolbarTarget = toolbarTarget[ part ] ;
                }

                toolbarTarget = toolbarTarget.document.getElementById( outMatch[2] ) ;
            },

            ToolbarSet_InitOutFrame : function( doc )
            {
                var head = getDocumentHead( doc ) ;

                head.appendChild( doc.createElement('base') ).href = window.document.location ;

                var targetWindow = doc.defaultView;

                targetWindow.adjust = function()
                {
                    targetWindow.frameElement.height = doc.body.scrollHeight;
                } ;

                targetWindow.onresize = targetWindow.adjust ;
                targetWindow.setTimeout( targetWindow.adjust, 0 ) ;

                doc.body.style.overflow = 'hidden';
                doc.body.innerHTML = document.getElementById( 'xToolbarSpace' ).innerHTML ;
            }
        } ;
    })();

    /*
     * ### Overrides
     */
    ( function()
    {
        // Save references for override reuse.
        var _Original_FCKPanel_Window_OnFocus    = FCKPanel_Window_OnFocus ;
        var _Original_FCKPanel_Window_OnBlur    = FCKPanel_Window_OnBlur ;
        var _Original_FCK_StartEditor            = FCK.StartEditor ;

        FCKPanel_Window_OnFocus = function( e, panel )
        {
            // Call the original implementation.
            _Original_FCKPanel_Window_OnFocus.call( this, e, panel ) ;

            if ( panel._focusTimer )
                clearTimeout( panel._focusTimer ) ;
        }

        FCKPanel_Window_OnBlur = function( e, panel )
        {
            // Delay the execution of the original function.
            panel._focusTimer = FCKTools.SetTimeout( _Original_FCKPanel_Window_OnBlur, 100, this, [ e, panel ] ) ;
        }

        FCK.StartEditor = function()
        {
            // Force pointing to the CSS files instead of using the inline CSS cached styles.
            window.FCK_InternalCSS            = FCKConfig.BasePath + 'css/fck_internal.css' ;
            window.FCK_ShowTableBordersCSS    = FCKConfig.BasePath + 'css/fck_showtableborders_gecko.css' ;

            _Original_FCK_StartEditor.apply( this, arguments ) ;
        }
    })();
}
